package auto.setting;

import auto.device.Phione;
import io.appium.java_client.AppiumBy;
import io.appium.java_client.AppiumDriver;
import org.openqa.selenium.TimeoutException;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

//这个类里面是通知声音的检测
public class NotificationSound {
//feature1:消息通知按钮的检测,消息通知按钮+应用内消息通知按钮+应用内提示音按钮+应用内振动按钮+更新同送通知服务按钮+重置所有通知设置按钮
    public String notificationSoundButtonDetection() throws InterruptedException {
        Phione phione = new Phione();
        AppiumDriver driver = phione.driver;
        WebDriverWait wait = phione.wait;
        //点击设置页面的通知声音选项
        String result=clickNotificationSound(wait,driver);
        if(!result.equals("正常")){
            System.out.println(result);
            driver.quit();
            return result;
        }
        //对通知声音页面的所有按钮进行检测
        result=pageButtonTest(wait,driver);
        if(!result.equals("正常")){
            System.out.println(result);
            driver.quit();
            return result;
        }


        System.out.println("通知声音按钮检测正常");
        driver.quit();
        return "通知声音按钮检测正常";
    }



//feature2:通知声音里面按钮选项的检测
    public String notificationSoundPageSkipDetection(){
        Phione phione = new Phione();
        AppiumDriver driver = phione.driver;
        WebDriverWait wait = phione.wait;
        //点击设置页面的通知声音选项
        String result=clickNotificationSound(wait,driver);
        if(!result.equals("正常")){
            System.out.println(result);
            driver.quit();
            return result;
        }

        //对消息预览和消息提示音页面进行检测
        result=skipTest(wait,driver);
        if(!result.equals("正常")){
            System.out.println(result);
            driver.quit();
            return result;
        }
        System.out.println("通知声音消息预览/消息提示音页面跳转检测成功");
        driver.quit();
        return "通知声音消息预览/消息提示音页面跳转检测成功";
    }










//    ---------------------------下面的私有方法是供上面的公有方法使用的-----------------------
    //feature:从设置页面点击通知后声音-----feature1用
    private String clickNotificationSound(WebDriverWait wait, AppiumDriver driver){
        try{
            //点击设置页面
            wait.until(ExpectedConditions.visibilityOfElementLocated(AppiumBy.iOSClassChain("**/XCUIElementTypeButton[`name == \"设置\"`]"))).click();
            //点击通知声音选项
            wait.until(ExpectedConditions.visibilityOfElementLocated(AppiumBy.accessibilityId("AppSettingsViewController.notifications"))).click();
            //检测有没有进入到通知声音的页面
            wait.until(ExpectedConditions.visibilityOfElementLocated(AppiumBy.iOSClassChain("**/XCUIElementTypeTextView[`name == \"消息通知\"`]")));
        }catch(TimeoutException e){
            return "点击设置页面-通知声音选项失败";
        }
        return "正常";
    }



    //feature:检测页面的按钮----feature1用
    private String pageButtonTest(WebDriverWait wait, AppiumDriver driver) throws InterruptedException {
        //消息通知按钮开关的检测
        try{
            //定位第一个按钮"消息通知"
            WebElement firstButton=wait.until(ExpectedConditions.visibilityOfElementLocated(AppiumBy.iOSClassChain("**/XCUIElementTypeSwitch[1]")));
            String firstButtonStateOld=firstButton.getAttribute("value");
            firstButton.click();

            firstButton=wait.until(ExpectedConditions.visibilityOfElementLocated(AppiumBy.iOSClassChain("**/XCUIElementTypeSwitch[1]")));
            String firstButtonStateNew=firstButton.getAttribute("value");

            if(firstButtonStateOld.equals(firstButtonStateNew)){
                return "点击消息按钮后没有变化";
            }
            System.out.println("消息通知按钮检测正常");
        }catch(TimeoutException e){
            return "消息通知按钮检测出现问题";
        }


        //应用内消息通知按钮+应用内提示音检测+应用内振动检测
        try{
            WebElement secondButton=wait.until(ExpectedConditions.visibilityOfElementLocated(AppiumBy.iOSClassChain("**/XCUIElementTypeSwitch[2]")));

            //首先查看应用内消息通知是不是已经关闭了,如果打开了就点击关闭,如果是关闭的就不进行处理
            String secondButtonState=secondButton.getAttribute("value");
            if(secondButtonState.equals("1")){
                secondButton.click();
                //如果关闭了就进行检查是不是有变化
                secondButton=wait.until(ExpectedConditions.visibilityOfElementLocated(AppiumBy.iOSClassChain("**/XCUIElementTypeSwitch[2]")));
                if ((secondButton.getAttribute("value")).equals(1)) {
                    return "无法点击应用内消息通知将其关闭";
                }
            }

            //分别定位应用内提示音按钮和应用内振动按钮,如果应用内消息通知按钮是关闭的,这两个按钮也应该是关闭的
            WebElement thirdButton=wait.until(ExpectedConditions.visibilityOfElementLocated(AppiumBy.iOSClassChain("**/XCUIElementTypeSwitch[3]")));
            WebElement fourthButton=wait.until(ExpectedConditions.visibilityOfElementLocated(AppiumBy.iOSClassChain("**/XCUIElementTypeSwitch[4]")));
            if(thirdButton.getAttribute("value").equals("1")){
                return "应用内消息通知按钮关闭的情况下,应用内提示音按钮可以进行打开";
            }
            if(fourthButton.getAttribute("value").equals("1")){
                return "应用内消息通知按钮关闭的情况下,应用内振动按钮可以进行打开";
            }


            //到了这里应用内消息通知按钮一定是关闭的
            //检测应用内提示音按钮在应用内消息通知按钮关闭的情况能不能进行打开
            thirdButton.click();
            Thread.sleep(4000);//等待提醒消失

            //出现提醒后需要重新进行定位,否则查找不到这个页面
            fourthButton=wait.until(ExpectedConditions.visibilityOfElementLocated(AppiumBy.iOSClassChain("**/XCUIElementTypeSwitch[4]")));
            fourthButton.click();
            Thread.sleep(4000);//等待提醒消失

            //查看点击过后有没有变化,如果没有开启是正确的,重新进行定位
            thirdButton=wait.until(ExpectedConditions.visibilityOfElementLocated(AppiumBy.iOSClassChain("**/XCUIElementTypeSwitch[3]")));
            fourthButton=wait.until(ExpectedConditions.visibilityOfElementLocated(AppiumBy.iOSClassChain("**/XCUIElementTypeSwitch[4]")));
            if(thirdButton.getAttribute("value").equals("1")){
                return "应用内消息通知按钮关闭的情况下,应用内提示音按钮可以进行打开";
            }
            if(fourthButton.getAttribute("value").equals("1")){
                return "应用内消息通知按钮关闭的情况下,应用内振动按钮可以进行打开";
            }


            //关闭的时候应用内的按钮检测正常,现在检查打开应用消息通知的按钮可不可以点击.  因为出现提示后,需要重新进行定位,提示算一个新的页面
            secondButton=wait.until(ExpectedConditions.visibilityOfElementLocated(AppiumBy.iOSClassChain("**/XCUIElementTypeSwitch[2]")));
            secondButton.click();
            //点击应用内消息通知后,下面三个按钮应该全部都打开
            secondButton=wait.until(ExpectedConditions.visibilityOfElementLocated(AppiumBy.iOSClassChain("**/XCUIElementTypeSwitch[2]")));
            thirdButton=wait.until(ExpectedConditions.visibilityOfElementLocated(AppiumBy.iOSClassChain("**/XCUIElementTypeSwitch[3]")));
            fourthButton=wait.until(ExpectedConditions.visibilityOfElementLocated(AppiumBy.iOSClassChain("**/XCUIElementTypeSwitch[4]")));

            if(secondButton.getAttribute("value").equals("0")){
                return "点击应用内消息通知按钮后,没有打开这个选项";
            }
            if(thirdButton.getAttribute("value").equals("0")){
                return "点击应用内消息通知按钮后,应用内提示音按钮没有开启";
            }
            if(fourthButton.getAttribute("value").equals("0")){
                return "点击应用内消息通知按钮后,消息内振动按钮没有开启";
            }


            //单独点击应用内提示音按钮和应用内振动按钮这两个有没有变化
            thirdButton.click();
            fourthButton.click();

            if(thirdButton.getAttribute("value").equals("1")){
                return "应用内消息通知按钮开启后,不能关闭应用内提示音按钮";
            }
            if(fourthButton.getAttribute("value").equals("1")){
                return "应用内消息通知按钮开启后,不能关闭应用内振动按钮";
            }

        }catch(TimeoutException e){
            return "应用内消息通知按钮/应用内提示音按钮/应用内振动按钮出现问题";
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println("应用内提示音三个按钮检测正常");

        //检测更新推送通知服务按钮
        try{
            wait.until(ExpectedConditions.visibilityOfElementLocated(AppiumBy.accessibilityId("更新推送通知服务"))).click();
            //只要还在这个页面没有闪退就是正常的,只要还在通知声音这个页面就是正常的
            wait.until(ExpectedConditions.visibilityOfElementLocated(AppiumBy.iOSClassChain("**/XCUIElementTypeTextView[`name == \"消息通知\"`]")));
        }catch(TimeoutException e){
            return "更新推送通知服务按钮存在异常";
        }
        System.out.println("更新推送通知服务按钮检测正常");
        Thread.sleep(4000);


        //检测重置所有通知设置
        try{
            wait.until(ExpectedConditions.visibilityOfElementLocated(AppiumBy.accessibilityId("重置所有通知设置"))).click();
            Thread.sleep(4000);

            //检测这四个按钮是不是都成为了开启的状态
            WebElement firstButton=wait.until(ExpectedConditions.visibilityOfElementLocated(AppiumBy.iOSClassChain("**/XCUIElementTypeSwitch[1]")));
            WebElement secondButton=wait.until(ExpectedConditions.visibilityOfElementLocated(AppiumBy.iOSClassChain("**/XCUIElementTypeSwitch[2]")));
            WebElement thirdButton=wait.until(ExpectedConditions.visibilityOfElementLocated(AppiumBy.iOSClassChain("**/XCUIElementTypeSwitch[3]")));
            WebElement fourthButton=wait.until(ExpectedConditions.visibilityOfElementLocated(AppiumBy.iOSClassChain("**/XCUIElementTypeSwitch[4]")));

            //检测这个按钮有没有被重置
            if(firstButton.getAttribute("value").equals("0")){
                return "点击重置所用通知设置按钮之后,消息通知按钮没有开启";
            }

            if(secondButton.getAttribute("value").equals("0")){
                return "点击重置所用通知设置按钮之后,应用内消息通知按钮没有开启";
            }

            if(thirdButton.getAttribute("value").equals("0")){
                return "点击重置所用通知设置按钮之后,应用内提示音按钮没有开启";
            }

            if(fourthButton.getAttribute("value").equals("0")){
                return "点击重置所用通知设置按钮之后,应用内振动按钮没有开启";
            }
        }catch(TimeoutException e){
            return "重置所有通知设置按钮异常";
        }
        System.out.println("重置所有通知设置按钮检测正常");

        //点击返回到设置页面完成检测
        try{
            wait.until(ExpectedConditions.visibilityOfElementLocated(AppiumBy.accessibilityId("返回"))).click();
            wait.until(ExpectedConditions.visibilityOfElementLocated(AppiumBy.iOSClassChain("**/XCUIElementTypeButton[`name == \"设置\"`]")));
        }catch(TimeoutException e){
            return "点击返回按钮之后,没有返回设置页面";
        }

        return "正常";
    }


    //feature:对通知声音选项的消息预览和消息提示音页面进行检测
    private String skipTest(WebDriverWait wait, AppiumDriver driver){
        //首先对消息预览页面进行检测
        try{
            //点击消息预览选项
            wait.until(ExpectedConditions.visibilityOfElementLocated(AppiumBy.accessibilityId("消息预览"))).click();
            //查看是不是进入到通知内容的页面了
            wait.until(ExpectedConditions.visibilityOfElementLocated(AppiumBy.iOSClassChain("**/XCUIElementTypeStaticText[`name == \"通知内容\"`]")));
        }catch(TimeoutException e){
            return "通知声音页面,消息预览选项跳转页面失败";
        }

        //查看通知内容页面三个选项是不是消失了
        try{
            wait.until(ExpectedConditions.visibilityOfElementLocated(AppiumBy.accessibilityId("昵称和内容"))).click();
            wait.until(ExpectedConditions.visibilityOfElementLocated(AppiumBy.accessibilityId("只显示昵称"))).click();
            wait.until(ExpectedConditions.visibilityOfElementLocated(AppiumBy.accessibilityId("没有昵称和内容"))).click();
        }catch(TimeoutException e){
            return "通知内容页面选项缺失";
        }

        //点击返回,查看另一个选项
        try{
            wait.until(ExpectedConditions.visibilityOfElementLocated(AppiumBy.accessibilityId("返回"))).click();
            wait.until(ExpectedConditions.visibilityOfElementLocated(AppiumBy.iOSClassChain("**/XCUIElementTypeStaticText[`name == \"通知声音\"`]")));
        }catch(TimeoutException e){
            return "通知内容页面返回通知声音页面失败";
        }

        //返回成功之后,检测消息提示音是否能跳转成功
        try{
            //点击消息提示音选项
            wait.until(ExpectedConditions.visibilityOfElementLocated(AppiumBy.accessibilityId("消息提示音"))).click();
            //查看是否跳转成功
            wait.until(ExpectedConditions.visibilityOfElementLocated(AppiumBy.accessibilityId("Aurora")));
        }catch (TimeoutException e){
            return "消息提示音页面跳转失败";
        }

        //点击提示音选项再点击取消
        try{
            wait.until(ExpectedConditions.visibilityOfElementLocated(AppiumBy.accessibilityId("Aurora"))).click();
            wait.until(ExpectedConditions.visibilityOfElementLocated(AppiumBy.accessibilityId("Note（默认）"))).click();
        }catch(TimeoutException e){
            return "点击消息提示音失败";
        }

        //点击返回到设置页面
        try{
            wait.until(ExpectedConditions.visibilityOfElementLocated(AppiumBy.accessibilityId("cancel_button"))).click();
            wait.until(ExpectedConditions.visibilityOfElementLocated(AppiumBy.accessibilityId("返回"))).click();
            wait.until(ExpectedConditions.visibilityOfElementLocated(AppiumBy.iOSClassChain("**/XCUIElementTypeButton[`name == \"设置\"`]")));
        }catch(TimeoutException e){
            return "返回到设置页面失败";
        }

        return "正常";
    }



}
